#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include<stdlib.h>
#include<string.h>
#include<errno.h>
#include<sys/wait.h>
int main()
{
   // printf("hello");
   // _exit(0);
   

//   //获取status测试代码
//   pid_t pid;
//   if((pid = fork())== -1)
//   {
//       perror("fork"),exit(1);
//   }
//   if(pid == 0)
//   {
//       //子进程
//       sleep(20);
//       exit(10);
//   }
//   else
//   {
//       int st;
//       int ret = wait(&st);
//       if(ret > 0 && (st & 0x7F) == 0)
//       {
//           //正常退出
//           printf("child exit code:%d\n",(st>>8)&0xFF);
//       }
//       else if(ret > 0)
//       {
//           //异常退出
//           printf("sig code:%d\n",st&0x7F);
//       }
//   }

//    }

   //  //阻塞等待
   // pid_t pid;
   // pid  = fork();
   // if(pid < 0)
   // {
   //     printf("%s fork error\n",__FUNCTION__);
   //     return 1;
   // }
   // else if(pid == 0)
   // {
   //     //子进程
   //     printf("child is running,pid is:%d\n",getpid());
   //     sleep(5);
   //     exit(257);
   // }
   // else
   // {
   //     int status = 0;
   //     pid_t ret = waitpid(-1,&status,0);//阻塞式等待
   //     printf("this is test for wait\n");
   //     if(WIFEXITED(status) && ret == pid)
   //     {
   //         printf("wait child 5s success, child return code is :%d.\n",WEXITSTATUS(status));

   //     }
   //     else
   //     {
   //         printf("wait child failed,reeturn.\n");
   //         return 1;
   //     }


   // //非阻塞等待
   // pid_t pid;
   // pid  = fork();
   // if(pid < 0)
   // {
   //     printf("%s fork error\n",__FUNCTION__);
   //     return 1;
   // }
   // else if(pid == 0)
   // {
   //     //子进程
   //     printf("child is running,pid is:%d\n",getpid());
   //     sleep(5);
   //     exit(1);
   // }
   // else
   // {
   //     int status = 0;
   //     pid_t ret = waitpid(-1,&status,WNOHANG);//阻塞式等待
   //     printf("this is test for wait\n");
   //     if(WIFEXITED(status) && ret == pid)
   //     {
   //         printf("wait child 5s success, child return code is :%d.\n",WEXITSTATUS(status));

   //     }
   //     else
   //     {
   //          printf("wait child failed,reeturn.\n");
   //         return 1;
   //     }
   // }



   // pid_t pid;
   // //获取当前进程的id
   // printf("Before : pid is %d\n",getpid());

   // //创建新进程
   // if((pid = fork()) == -1)
   // {
   //     perror("fork()");
   // }
   // else
   // {
   //     printf("After:pid is %d, fork return %d\n", getpid(), pid);
   //     sleep(1);
   // }
   
   
   //exec函数调用：
     char *const argv[] = {"ps", "-ef", NULL};
     char *const envp[] = {"PATH=/bin:/usr/bin", "TERM=console", NULL};
     execl("/bin/ps", "ps", "-ef", NULL);
     // 带p的，可以使用环境变量PATH，无需写全路径
     execlp("ps", "ps", "-ef", NULL);
     // 带e的，需要自己组装环境变量
     execle("ps", "ps", "-ef", NULL, envp);
     execv("/bin/ps", argv);

     // 带p的，可以使用环境变量PATH，无需写全路径
     execvp("ps", argv);
     // 带e的，需要自己组装环境变量
    execve("/bin/ps", argv, envp);
    exit(0);



    return 0;
}

